在家庭任務平台中使用了許多Eloquent提供的關係,例如:
User和Profile是一對一的關係(One To One):每個使用者可以擁有一個人資料,一個人資料屬於一個使用者 。
User和Project是一對多的關係(One To Many):每個使用者可以創建多個計畫,一個計畫屬於一個使用者。
User和Task是一對多的關係(One To Many):每個使用者可以被指派多個任務,一個任務指派給一個使用者。
User和Activity是一對多的關係(One To Many):每個使用者可以產生多個行為,一個行為是由一個使用者產生。
但是一個使用者所創建的計畫可以邀請其他人參加,所以一個計畫可以擁有許多參加計畫的成員,而一個成員可以參與多種計畫,所以一對多或一對一的關係並不適用,需要多對多的關係。
一對一、一對多、多對多關係的簡化欄位表格如下:
簡化資料表:users
id | name |
---|
1|jhao|jhao@it.com
2|kid|kid@it.com
3|gill|gill@it.com
一對一:簡化資料表:profiles
id | user_id | avatar |
---|
1|2|x.jpg
2|1|y.jpg
3|3|z.jpg
一對多:簡化資料表:projects
id | owner_id(user_id) | title |
---|
1|2|台南行
2|1|練習開車
3|1|寫文章
4|1|大賣場採買
多對多:簡化資料表:member_project,在多對多的關係時,會多產生一個資料表(intermediate table)將不同表連結在一起
user_id | project_id |
---|
1|1
3|1
2|2
3|3
但是這些連結方式會在activities的資料表遇見麻煩,因為我們需要紀錄使用者對兩種Model計畫和任務進行增修的活動,如果採用上述的方式,由於對應的Model是固定的,我們就必須要產生兩個資料表紀錄同一種概念,產生明顯地重複。
id | user_id | project_id | change |
---|
1|2|1|create_project
id | user_id | task_id | change |
---|
1|3|1|create_task
如果遇到需要對更多不同Model的活動進行紀錄,就會產生更多的資料表,但是僅有些微的差異,常見的日常舉例有:使用者可以喜歡貼文,喜歡評論,喜歡影片等等,在這種情況下,就會多增加資料表。因此,Eloquent提供了Polymorphic系列,讓同一概念的資料表可以對應到不同的Model,而無需一直增加資料表。
所以接下來的幾天我們要來介紹三大Eloquent關係系列,分別為:
參考文件:
Eloquent: Relationships
Laracast:Eloquent Relationships